package ar.com.larreta.procesos.pasos;

import java.util.List;
import java.util.Map;

import org.hibernate.Criteria;
import org.hibernate.criterion.SimpleExpression;

import ar.com.larreta.excepciones.Excepcion;
import ar.com.larreta.persistencia.HerramientasDao;
import ar.com.larreta.procesos.Entrada;
import ar.com.larreta.procesos.PasoConDAO;

public class GenerarCriteria extends PasoConDAO {

	public static final String PROPIEDADES = "properties";
	public static final String FILTROS = "filters";
	public static final String CLASE_PERSISTENTE = "clasePersistente";
	public static final String LIMIT = "limit";
	public static final String OFFSET = "offset";
	public static final String SORT_DIR = "sortDir";
	public static final String SORT_FIELD = "sortField";
	public static final String ALIAS_ENTIDAD_PRINCIPAL = "AEP";
	public static final String ID = "id";
	public static final String PUNTO = ".";
	public static final String PUNTO_ID = PUNTO + ID;
	
	/**
	 * Retorna los filtros para la peticion de la lista actual
	 * @return
	 */
	protected List getFiltros() {
		Entrada entradaPropiedades = entradas.get(PROPIEDADES);
		if (entradaPropiedades!=null){
			Map propiedades = (Map) entradaPropiedades.getValor();
			List filtros = null;
			if (propiedades!=null){
				filtros = (List) propiedades.get(FILTROS);
			}
			return filtros;
		}
		return null;
	}

	@Override
	protected void accion() {

		Entrada clasePersistente = entradas.get(CLASE_PERSISTENTE);
		Entrada limit = entradas.get(LIMIT);
		Entrada offset = entradas.get(OFFSET);
		Entrada sortDir = entradas.get(SORT_DIR);
		Entrada sortField = entradas.get(SORT_FIELD);
		
		try {
			Class clase = Class.forName((String)clasePersistente.getValor());
			List<SimpleExpression> expresiones = getExpresions();

			Criteria criteriaLista = getDao().getCriteria(ALIAS_ENTIDAD_PRINCIPAL, clase, 
					(Integer)offset.getValor(),	(Integer)limit.getValor(), 
					HerramientasDao.ordenar((String)sortDir.getValor(), (String)sortField.getValor()), 
					expresiones);

			Criteria criteriaContar = getDao().getCriteria(ALIAS_ENTIDAD_PRINCIPAL, clase, null, null, null, expresiones);
			
			salidas.put(CRITERIA_LISTA, criteriaLista);
			salidas.put(CRITERIA_CONTAR, criteriaContar);
			
		} catch (ClassNotFoundException e) {
			logger.error(Excepcion.getStackTrace(e));
		}
		
		
	}

	protected List<SimpleExpression> getExpresions() {
		return HerramientasDao.getInstancia().getExpresiones(getFiltros());
	}

}
